package com.wulis.common.wrapper;

import com.wulis.common.model.enums.HttpStatusEnum;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.io.Serializable;

/**
 * @param <T>
 * @author wulis
 */
@Data
@ApiModel(description ="接口返回类")
public class ApiWrapper<T> implements Serializable {
    
    /**
     * 序列化标识
     */
    private static final long serialVersionUID = 4893280118017319089L;
    
    /**
     * 状态码
     */
    @ApiModelProperty("状态码")
    private int code;
    
    /**
     * 提示信息
     */
    @ApiModelProperty("提示信息")
    private String message;
    
    /**
     * 返回参数
     */
    @ApiModelProperty("返回参数")
    private T data;
    
    public ApiWrapper() {
    }
    
    /**
     * Instantiates a new wrapper.
     *
     * @param code the code
     * @param message the message
     */
    public ApiWrapper(int code, String message) {
        this(code, message, null);
    }
    
    /**
     * Instantiates a new wrapper.
     *
     * @param code the code
     * @param message the message
     * @param data the data
     */
    public ApiWrapper(int code, String message, T data) {
        super();
        this.code(code).message(message).data(data);
    }
    
    /**
     * Sets the 编号 , 返回自身的引用.
     *
     * @param code the new 编号
     * @return the wrapper
     */
    private ApiWrapper<T> code(int code) {
        this.setCode(code);
        return this;
    }
    
    /**
     * Sets the 信息 , 返回自身的引用.
     *
     * @param message the new 信息
     * @return the wrapper
     */
    private ApiWrapper<T> message(String message) {
        this.setMessage(message);
        return this;
    }
    
    /**
     * Sets the 结果数据 , 返回自身的引用.
     *
     * @param data the new 结果数据
     * @return the wrapper
     */
    public ApiWrapper<T> data(T data) {
        this.setData(data);
        return this;
    }
    
    /**
     * 判断是否成功： 依据 Wrapper.SUCCESS_CODE == this.code
     */
    public boolean success() {
        return HttpStatusEnum.SUCCESS.code() == this.code;
    }
    
    /**
     * 判断是否成功： 依据 Wrapper.SUCCESS_CODE != this.code
     */
    public boolean error() {
        return !success();
    }
    
}
